package es.ugr.beequizz.controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import es.ugr.beequizz.bean.IncluirRespuestaBean;
import es.ugr.beequizz.bean.RespuestaBean;
import es.ugr.beequizz.bean.ValidacionBean;
import es.ugr.beequizz.converter.IncluirRespuestaConverter;
import es.ugr.beequizz.dto.IdDTO;
import es.ugr.beequizz.dto.IncluirRespuestaDTO;
import es.ugr.beequizz.dto.RespuestaDTO;
import es.ugr.beequizz.dto.ResultadoDTO;
import es.ugr.beequizz.dto.ValidarDTO;
import es.ugr.beequizz.model.Respuesta;
import es.ugr.beequizz.model.Usuario;
import es.ugr.beequizz.services.RespuestaService;
import es.ugr.beequizz.services.UsuarioService;

@Controller
@RequestMapping(value= "/respuesta")
public class RespuestaController {
	
	@Autowired
	private RespuestaService respuestaService;

	@Autowired
	private UsuarioService usuarioService;
	
	@Autowired
	private IncluirRespuestaConverter incluirRespuestaConverter;
	
	
	@RequestMapping(value= "/incluirRespuesta",method= RequestMethod.POST,
			produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
	@ResponseBody
	public ResultadoDTO incluirRespuestaDTO (@RequestBody String json) throws JsonParseException, JsonMappingException, IOException{
		
		final ObjectMapper mapper = new ObjectMapper();
		final List<IncluirRespuestaDTO> respuestas = mapper.readValue(json, new TypeReference<List<IncluirRespuestaDTO>>() {});
		
		final String username = SecurityContextHolder.getContext().getAuthentication().getName();
		Long idUsuario = usuarioService.recuperarIdUsuario(username);
		
		
		List<IncluirRespuestaBean> listaRespuesta = new ArrayList<IncluirRespuestaBean>();
		for (IncluirRespuestaDTO dto : respuestas){
			IncluirRespuestaBean bean = incluirRespuestaConverter.convert(dto);
			bean.setCreadorId(idUsuario);
			listaRespuesta.add(bean);
		}
		
		// Appel service
		respuestaService.incluirRespuesta(listaRespuesta);
		return new ResultadoDTO("SUCCESS");
	}
	
	/* Metodo para recuperar las respuestas asociadas a una pregunta */
	
	@RequestMapping(value="/recuperarRespuestas", method= RequestMethod.GET,
			produces = MediaType.APPLICATION_JSON_VALUE, params = {"preguntaId"})
	@ResponseBody
	public List<RespuestaDTO> recuperarRespuestas(@RequestParam(value = "preguntaId") Long preguntaId){
				
		List<Respuesta> respuestasBean = respuestaService.recuperarRespuestas(preguntaId);
		
		List<RespuestaDTO> respuestas = new ArrayList<RespuestaDTO>();
		
		for (Respuesta respuesta : respuestasBean){
			
			RespuestaDTO dto = new RespuestaDTO();
			dto.setId(respuesta.getId());	
			dto.setCorrecta(respuesta.getCorrecta());
			dto.setContenidoRespuesta(respuesta.getContenidoRespuesta());
			dto.setCreador(recuperarCreador(respuesta.getCreador()));
			dto.setValida(respuesta.getValida());
			respuestas.add(dto);
		}
		return respuestas;
	}
	
	private String recuperarCreador(Usuario usuario) {
		return String.format("%s %s", usuario.getNombre(), usuario.getApellidos());
	}
	
	@RequestMapping(value="/recuperarRespuesta", method= RequestMethod.GET,
			produces = MediaType.APPLICATION_JSON_VALUE,  params = {"respuestaId"})
	@ResponseBody
	public RespuestaDTO recuperarRespuesta (@RequestParam(value = "respuestaId") Long respuestaId) {
		
		RespuestaBean respuestaBean = respuestaService.recuperarRespuesta(respuestaId);
		RespuestaDTO dto = new RespuestaDTO();
		dto.setId(respuestaBean.getId());
		dto.setContenidoRespuesta(respuestaBean.getContenidoRespuesta());
		dto.setCorrecta(respuestaBean.getCorrecta());
		dto.setValida(respuestaBean.isValida());
		return dto;
	}
	
	@RequestMapping(value="/modificarRespuesta", method= RequestMethod.POST,
			produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
	@ResponseBody
	public ResultadoDTO modificarRespuesta (@RequestBody RespuestaDTO dto) {
		
		final RespuestaBean respuestaBean = new RespuestaBean();
		respuestaBean.setId(dto.getId());
		respuestaBean.setCorrecta(dto.getCorrecta());
		respuestaBean.setContenidoRespuesta(dto.getContenidoRespuesta());
		respuestaBean.setValida(dto.getValida());
		
		respuestaService.modificarRespuesta(respuestaBean);
		
		return new ResultadoDTO("SUCCESS");
	}
	
	
	/* Metodo para suprimir respuestas */
	@RequestMapping(value="/suprimirRespuesta", method= RequestMethod.POST,
			produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
	@ResponseBody
	public ResultadoDTO suprimirRespuesta (@RequestBody String json) throws JsonParseException, JsonMappingException, IOException{

		final ObjectMapper mapper = new ObjectMapper();
		final List<IdDTO> idDtos = mapper.readValue(json, new TypeReference<List<IdDTO>>() {});
		
		try {
			//List<Long> listaIdRespuestaASuprimir = new ArrayList<Long>();
			for (IdDTO dto : idDtos){
				// Llamada al servicio que borra la respuesta
				respuestaService.suprimirRespuesta(dto.getId());
			}
			
			
			return new ResultadoDTO("SUCCESS");
			
		} catch (Exception e) {
			return new ResultadoDTO("ERROR", "Imposible de suprimir esas respuestas.");
		}
		
	}
	
	/* Metodo para validar preguntas*/
	@RequestMapping(value="/validacionRespuestas", method= RequestMethod.POST,
			produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
	@ResponseBody
	public ResultadoDTO validarRespuestas(@RequestBody String json) throws JsonParseException, JsonMappingException, IOException{
		
		final ObjectMapper mapper = new ObjectMapper();
		final List<ValidarDTO> dtos = mapper.readValue(json, new TypeReference<List<ValidarDTO>>() {});
		final List<ValidacionBean> beans = new ArrayList<ValidacionBean>();
		
		for (ValidarDTO dto : dtos){
			final ValidacionBean bean = new ValidacionBean();
			bean.setId(dto.getId());
			bean.setValido(dto.isValida());
			
			beans.add(bean);
		}
		respuestaService.validacionRespuesta(beans);

		return new ResultadoDTO("SUCCESS");
		
		
	}
	
	
}
